home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Light ROM 1
/
LIGHT-ROM 1 (Amiga Library Services)(1994).iso
/
ffdisks
/
d931.lha
/
Modules
/
GamePortDevice
/
GamePortDevice.def
/
GamePortDevice.def
Wrap
Text File
|
1993-12-20
|
7KB
|
162 lines
DEFINITION MODULE GamePortDevice;
(* Version 1.0 *)
(* Diese Routinen helfen dem Programmierer auf einfachste Weise die *)
(* GamePorts nach verschiedenen Geräten, wie z.B. Joystick, relativen *)
(* Joystick und Maus, abzufragen. *)
(* Die Files GamePortDevice.obj und GamePortDevice.sym sind Copyright- *)
(* frei. Sie dürfen auch in kommerziellen Produkten benutzt werden. *)
(* Diese Files dürfen allerdings nur mit den Sourcecodes und dem Demo *)
(* weitergegeben werden. *)
(* Jeder Art Änderungen am Sourcecode oder am Definitionsfile ohne *)
(* meine ausdrückliche Genehmigung sind verboten. Das Definitionsfile *)
(* und der Sourcecode, sowie Teile daraus, sind Copyrightgeschützt! *)
(* © 1991 by Andre Wiethoff *)
(* *)
(* Bei Verbesserungsvorschlägen, Fehlern oder bei Fragen: *)
(* Andre Wiethoff *)
(* Höhenweg 2 *)
(* D-57392 Schmallenberg / Germany *)
FROM ExecD IMPORT MsgPort,IOStdReq;
FROM InputEvent IMPORT lButton,rButton,mButton,upPrefix;
FROM GamePort IMPORT GamePortTrigger,Controller;
CONST
(* Die folgenden Konstanten können bei der Auswertung der Events *)
(* aus 'ReadEvent' benutzt werden, um zu ermitteln welche Tasten des *)
(* Eingabegeräts gedrückt bzw. losgelassen wurden. *)
lButtonDown = lButton;
lButtonUp = lButton+upPrefix;
rButtonDown = rButton;
rButtonUp = rButton+upPrefix;
mButtonDown = mButton;
mButtonUp = mButton+upPrefix;
noButton = 0FFH; (* Siehe InputEvent *)
(* Die Konstanten 'portA' und 'portB' können bei 'OpenGamePort' dazu *)
(* benutzt werden, den gewünschten GamePort anzugeben. *)
portA = 1;
portB = 2;
TYPE GamePortHandlePtr = POINTER TO GamePortHandle;
GamePortHandle = RECORD
msgPort : MsgPort;
ioGamePort : IOStdReq;
controller : Controller;
END;
(* 'OpenGamePort' öffnet das GamePortDevice für einen angegebenen Port *)
(* der in 'port' angegeben werden muß. Wenn ein Programm mehrere Ports *)
(* belegen möchte muß es das Device mehrere Male mit jeweils dem Port *)
(* öffnen. Der Port A ist allerdings vom InputDevice belegt, um die *)
(* Mausbewegungen auszulesen. Erst wenn das InputDevice ausgeschaltet *)
(* wird, kann auch auf den Port A zugegriffen werden. *)
(* Es wird ein Zeiger auf die 'GamePortHandle'-Struktur zurückgegeben, *)
(* die bei den folgenden Befehlen mit übergeben werden muß. *)
PROCEDURE OpenGamePort(port : LONGINT) : GamePortHandlePtr;
(* 'ResetGamePort' löscht alle noch im Buffer befindlichen Events für *)
(* den jeweiligen Port. *)
PROCEDURE ResetGamePort(gp : GamePortHandlePtr);
(* 'SetControllerType' legt fest, welche Art von Eingabegerät an dem *)
(* jeweiligen Port angeschlossen ist. 'Controller' kann aus dem Modul *)
(* GamePort importiert werden und die Flags 'noController', 'mouse', *)
(* 'absJoystick' und 'relJoystick' annehmen. Ein relativer Joystick *)
(* kann außer einer einfachen Richtungsangabe auch noch die Auslenkung *)
(* in die jeweilige Richtung bestimmen. Dazu wird allerdings ein *)
(* spezieller Joystick benötigt! Wenn kein Fehler auftretet gibt *)
(* die Routine ein TRUE zurück, wenn aber der neue Controller nicht *)
(* gesetzt werden konnte, ein FALSE. *)
PROCEDURE SetControllerType(gp : GamePortHandlePtr;
c : Controller) : BOOLEAN;
(* 'GetControllerType' stellt das Gegenstück zu 'SetControllerType' *)
(* dar. Man bekommt in der Variablen 'c' den aktuellen Controller *)
(* an dem jeweiligen Port übergeben, wenn der Port von dem eigenen *)
(* Programm belegt wurde. Wenn der Port schon von einem fremden *)
(* Programm belegt ist, wird ein FALSE zurückgegeben, ansonsten ein *)
(* TRUE. Aber selbst wenn ein TRUE zurückgegeben wird muß noch geprüft *)
(* werden, ob 'c' gleich 'noController' ist. Mit dieser Funktion kann *)
(* man gut und einfach bestimmen, ob der jeweilige Port schon belegt *)
(* ist. *)
PROCEDURE GetControllerType( gp : GamePortHandlePtr;
VAR c : Controller) : BOOLEAN;
(* 'SetTrigger' übergibt dem Device einige Informationen, wie es auf *)
(* die Bewegungen reagieren soll. In der Struktur 'GamePortTrigger' *)
(* aus dem Modul GamePort müssen verschiedene Werte eingetragen werden:*)
(* 'keys' : hier muß vermerkt werden ob ein Event gewünscht wird, *)
(* wenn ein Knopf gedrückt bzw. losgelassen wurde. *)
(* 'timeout' : gibt an in 1/50 Sekunden, nach welcher Zeit ein Event *)
(* verschickt wird, wenn keine Änderung des Zustandes *)
(* eingetreten ist. *)
(* 'xDelta' : Gibt an nach wievielen Registrationen von Bewegungen *)
(* in X-Richtung eine Bewegung um 1 Pixel gesendet werden *)
(* soll. Dieses sollte für den absJoystick auf 1 gesetzt *)
(* werden, da ansonsten bei Bewegungen keine Events mehr *)
(* gesendet werden, sondern nur nach dem 'timeout' in *)
(* Erfahrung gebracht werden kann, ob der Joystick bewegt *)
(* wurde. Bei den anderen Eingabegeräten kann man damit *)
(* die Geschwindigkeit regulieren. Je höher der Wert, *)
(* desto weniger Pixel wird die Auswertung ausgeben. *)
(* 'yDelta' : Es gilt das gleiche wie für 'xDelta', nur in Y-Richtung.*)
PROCEDURE SetTrigger(gp : GamePortHandlePtr;
gpt : GamePortTrigger);
(* 'GetTrigger' besorgt sich die aktuellen 'GamePortTrigger'-Daten, *)
(* wie bei 'SetTrigger' erläutert. *)
PROCEDURE GetTrigger( gp : GamePortHandlePtr;
VAR gpt : GamePortTrigger);
(* 'ReadEvent' liest ein Event aus dem Buffer und gibt die benötigten *)
(* Werte zurück. Die relative Bewegung zum letzten Aufruf wird in *)
(* 'x' und 'y' gespeichert und die Knopfaktivitäten in 'button'. *)
(* Die Werte die 'button' annehmen kann, sind im Konstantenteil *)
(* deklariert. *)
PROCEDURE ReadEvent( gp : GamePortHandlePtr;
VAR x,y : INTEGER;
VAR button : CARDINAL);
(* 'CloseGamePort' gibt den Port wieder frei und schließt das Device. *)
(* Dieser Befehl wird auch automatisch am Programmende aufgerufen. *)
PROCEDURE CloseGamePort(VAR gp : GamePortHandlePtr);
END GamePortDevice.